#include <stdio.h>
#include <sys/shm.h>
#include <unistd.h>
// 存放pipe，用来使进程互斥
int fp[2];
int init_pipe(void);
void close_pipe(void);
void sleep_pipe(void);
void wake_pipe(void);
int main(void)
{
	// 创建虚拟内存块
	key_t k = 888;
	int shmid;
	if((shmid = shmget(k,sizeof(int),IPC_CREAT | 0777)) == -1)
	{
		perror("shmget error");
		return 1;
	}
	// 映射共享内存，可直接在fork映射也可以在fork后映射
	/*
	int* share_p = shmat(shmid,NULL,0);
	if((int)share_p == -1)
	{
		perror("shmat error");
		return 1;
	}
	*/
	// 初始化pipe
	init_pipe();
	int pid = fork();
	if(pid == -1)
	{
		perror("fork error");
		return 1;
	}
	if(pid > 0)
	{
		// 映射共享内存
		int* share_p = shmat(shmid,NULL,0);
		if((int)share_p == -1)
		{
			perror("shmat error");
			return 1;
		}
		*share_p = 8;
		wake_pipe();
		wait(NULL);
		// 接触共享内存映射
		shmdt(share_p);
		// 删除共享内存
		shmctl(shmid,IPC_RMID,NULL);
	}
	else if(pid == 0)
	{
		// 映射共享内存
		int* share_p = shmat(shmid,NULL,0);
		if((int)share_p == -1)
		{
			perror("shmat error");
			return 1;
		}
		sleep_pipe();
		printf("*share_p = %d\n",*share_p);
		// 接触共享内存映射
		shmdt(share_p);
	}
	// 关闭pipe
	close_pipe();
	return 0;
}
int init_pipe(void)
{
	return pipe(fp);
}
void close_pipe(void)
{
	close(fp[0]);
	close(fp[1]);
}
void sleep_pipe(void)
{
	char c;
	read(fp[0],(void*)&c,sizeof(c));
}
void wake_pipe(void)
{
	char c = 'D';
	write(fp[1],(void*)&c,sizeof(c));
}
